/*
题目：乘积小于 K 的子数组
给你一个整数数组 nums 和一个整数 k ，请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。
https://leetcode.cn/problems/subarray-product-less-than-k/
 */
public class NumSubarrayProductLessThanK {
    public int numSubarrayProductLessThanK(int[] nums, int k) {
        int currMul = 1;
        int res = 0;
        int left = 0;

        for (int i = 0; i < nums.length; i++) {
            currMul *= nums[i];
            while (left <= i && currMul >= k) {
                currMul /= nums[left];
                left++;
            }
            //i - left + 1是以右端点元素为末尾元素的子数组的个数(区间多长，含末尾元素的子数组就有多少个)，所有元素做队尾的子数组数之和就是符合条件子数组的个数。
            res += i - left + 1;
        }

        return res;
    }
}
